iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
自我挑戰組

認識JavaScript系列 第 15

[第十五天] 試著解題 2715. Timeout Cancellation

  • 分享至 

  • xImage
  •  

Given a function fn, an array of arguments args, and a timeout t in milliseconds, return a cancel function cancelFn.
After a delay of cancelTimeMs, the returned cancel function cancelFn will be invoked.
setTimeout(cancelFn, cancelTimeMs)
Initially, the execution of the function fn should be delayed by t milliseconds.
If, before the delay of t milliseconds, the function cancelFn is invoked, it should cancel the delayed execution of fn. Otherwise, if cancelFn is not invoked within the specified delay t, fn should be executed with the provided args as arguments.

提供一個function叫fn,還有個參數args,以及timeout時間t,回傳cancel function。

最初,應該延遲的是t時間,但在延遲的過程中呼叫了cancel function時,所以取消有關於t的延遲執行。如果在指定的延遲t時間內未呼叫時,則使用提供的參數args執行fn。

一開始

var cancellable = function(fn, args, t) {
    const cancelTimeMs = 50;

    function exe() {
        const result = [];
        result.push({ time: t, returned: fn(...args) });
        console.log(result);
    }

    let timeout = setTimeout(exe, cancelTimeMs);
    return function cancelTimeMs() {
        clearTimeout(timeout);
    };
};

首先,
錯誤1:不需要設定cancelTimeMs,
錯誤2:而且不管怎麼樣,都會執行fn,那就跟題目不一樣了。
如果t是20而cancleTimeMs是50,就要執行fn;
如果t是100而cancleTimeMs是50,就取消fn的延遲執行。
所以才會用到clearTimeout()~

繼續修改

var cancellable = function(fn, args, t) {
    const timer = setTimeout(() => {
        fn(...args);
    }, t);

    return function cancelTimeMs() {
        clearTimeout(timer);
    };
};

有個const timer用來設定fn的延遲(t秒)執行,
在外面包一個取消執行,就能達到題目要求。
只要t秒小於外面,就會成功執行;否則,取消。


上一篇
[第十四天] Garbage Collection
下一篇
[第十六天] 牛刀小試-中原標準時間
系列文
認識JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言